/**
 * 侧边栏管理器
 * 提供隐藏/显示右侧边栏的功能
 */

frappe.provide('frappe.theme.sidebar');

frappe.theme.sidebar.Manager = class SidebarManager {
	constructor() {
		this.sidebar_state = {
			hidden: false,
			animating: false
		};
		this.init();
	}

	init() {
		this.bind_events();
		this.setup_toggle_button();
		this.load_user_preference();
	}

	/**
	 * 绑定事件监听器
	 */
	bind_events() {
		// 监听窗口大小变化
		$(window).on('resize', () => {
			this.handle_window_resize();
		});

		// 监听页面路由变化
		$(document).on('page-change', () => {
			setTimeout(() => {
				this.setup_toggle_button();
				this.apply_sidebar_state();
			}, 100);
		});
	}

	/**
	 * 设置切换按钮
	 */
	setup_toggle_button() {
		// 移除已存在的按钮
		$('.theme-sidebar-toggle').remove();

		// 在页面标题区域添加切换按钮
		const toggleButton = $(`
			<button class="btn btn-sm btn-secondary theme-sidebar-toggle" 
			        title="切换右侧边栏显示状态" 
			        style="margin-left: 8px;">
				<i class="fa fa-sidebar"></i>
			</button>
		`);

		// 插入到页面标题区域
		if ($('.page-head .title-area').length) {
			$('.page-head .title-area').append(toggleButton);
		} else if ($('.page-actions').length) {
			$('.page-actions').append(toggleButton);
		}

		// 绑定点击事件
		toggleButton.on('click', () => {
			this.toggle_sidebar();
		});
	}

	/**
	 * 切换右侧边栏
	 */
	async toggle_sidebar() {
		if (this.sidebar_state.animating) return;

		try {
			this.sidebar_state.animating = true;

			// 调用后端API切换状态
			const response = await frappe.call({
				method: 'theme.utils.sidebar_utils.toggle_right_sidebar'
			});

			if (response.message && response.message.success) {
				this.sidebar_state.hidden = response.message.hidden;
				this.apply_sidebar_state();
				this.update_toggle_button_icon();
				
				// 显示通知
				frappe.show_alert({
					message: response.message.message,
					indicator: 'green'
				}, 2);
			}
		} catch (error) {
			console.error('切换侧边栏失败:', error);
			frappe.show_alert({
				message: '切换侧边栏失败',
				indicator: 'red'
			}, 3);
		} finally {
			this.sidebar_state.animating = false;
		}
	}

	/**
	 * 应用侧边栏状态
	 */
	apply_sidebar_state() {
		const self = this;
		const layoutMain = $('.layout-main');
		const layoutMainSectionWrapper = $('.layout-main-section-wrapper');
		const layoutSideSection = $('.layout-side-section');

		if (this.sidebar_state.hidden) {
			// 隐藏侧边栏
			this.force_hide_layout(layoutSideSection, layoutMain, layoutMainSectionWrapper);
			
		} else {
			// 显示侧边栏 - 使用简化方法
			this.force_show_layout(layoutSideSection, layoutMain, layoutMainSectionWrapper);
		}
	}

	/**
	 * 强制隐藏布局
	 */
	force_hide_layout(layoutSideSection, layoutMain, layoutMainSectionWrapper) {
		// 第一步：移除所有相关类
		layoutMain.removeClass('theme-full-width');
		layoutMainSectionWrapper.removeClass('theme-full-width');
		
		// 第二步：设置隐藏样式
		layoutSideSection.addClass('theme-sidebar-hidden');
		
		// 第三步：简单设置样式
		layoutMain.addClass('theme-full-width');
		layoutMainSectionWrapper.addClass('theme-full-width');
	}

	/**
	 * 强制显示布局 - 使用最简单的方法
	 */
	force_show_layout(layoutSideSection, layoutMain, layoutMainSectionWrapper) {
		// 第一步：移除所有相关的类和样式
		layoutSideSection.removeClass('theme-sidebar-hidden').css('width', '');
		layoutMain.removeClass('theme-full-width').css({
			'width': '',
			'flex': ''
		});
		layoutMainSectionWrapper.removeClass('theme-full-width').css({
			'width': '',
			'flex': ''
		});
		
		// 第二步：强制重绘
		if (layoutMain[0]) layoutMain[0].offsetHeight;
		if (layoutMainSectionWrapper[0]) layoutMainSectionWrapper[0].offsetHeight;
		
		// 第三步：简单设置样式，不使用flex
		layoutMain.css({
			'display': 'block',
			'float': 'none',
			'margin': '0',
			'padding': '0'
		});
		
		layoutMainSectionWrapper.css({
			'display': 'block',
			'float': 'none',
			'margin': '0',
			'padding': '0'
		});
	}

	/**
	 * 更新切换按钮图标
	 */
	update_toggle_button_icon() {
		const toggleButton = $('.theme-sidebar-toggle');
		const icon = toggleButton.find('i');
		
		if (this.sidebar_state.hidden) {
			icon.removeClass('fa-sidebar').addClass('fa-sidebar-open');
			toggleButton.attr('title', '显示右侧边栏');
		} else {
			icon.removeClass('fa-sidebar-open').addClass('fa-sidebar');
			toggleButton.attr('title', '隐藏右侧边栏');
		}
	}

	/**
	 * 加载用户偏好设置
	 */
	async load_user_preference() {
		try {
			const response = await frappe.call({
				method: 'theme.utils.sidebar_utils.get_sidebar_state'
			});

			if (response.message && response.message.success) {
				this.sidebar_state.hidden = response.message.hidden;
				this.apply_sidebar_state();
				this.update_toggle_button_icon();
			}
		} catch (error) {
			console.error('加载用户偏好设置失败:', error);
		}
	}

	/**
	 * 处理窗口大小变化
	 */
	handle_window_resize() {
		if (window.innerWidth < 768 && !this.sidebar_state.hidden) {
			// 小屏幕下自动隐藏侧边栏
			this.sidebar_state.hidden = true;
			this.apply_sidebar_state();
			this.update_toggle_button_icon();
		}
	}

	/**
	 * 强制隐藏侧边栏（用于特定页面）
	 */
	force_hide() {
		this.sidebar_state.hidden = true;
		this.apply_sidebar_state();
		this.update_toggle_button_icon();
	}

	/**
	 * 强制显示侧边栏（用于特定页面）
	 */
	force_show() {
		this.sidebar_state.hidden = false;
		this.apply_sidebar_state();
		this.update_toggle_button_icon();
	}

	/**
	 * 刷新主内容区域
	 * 显示侧边栏时触发页面内容刷新
	 */
	refresh_main_content() {
		// 刷新页面内容 - 模拟页面重新加载效果
		const mainContent = $('.layout-main-section');
		
		if (mainContent.length) {
			// 添加短暂的视觉反馈
			mainContent.css('opacity', '0.8');
			
			setTimeout(() => {
				// 恢复透明度
				mainContent.css('opacity', '1');
				
				// 触发页面刷新事件，让其他组件可以响应
				$(document.body).trigger('sidebar:content-refresh');
				
			}, 200);
		}
	}
};

// 初始化侧边栏管理器
$(document).ready(() => {
	// 等待frappe加载完成
	setTimeout(() => {
		if (typeof frappe !== 'undefined' && frappe.ui && frappe.ui.Page) {
			// 重写frappe.ui.Page的setup_hide_right_sidebar_menu方法
			if (!frappe.ui.Page.prototype.setup_hide_right_sidebar_menu) {
				frappe.ui.Page.prototype.setup_hide_right_sidebar_menu = function() {
					// 创建侧边栏管理器实例
					if (!window.themeSidebarManager) {
						window.themeSidebarManager = new frappe.theme.sidebar.Manager();
					}
				};
			}

			// 重写frappe.ui.make_app_page方法以确保初始化
			const originalMakeAppPage = frappe.ui.make_app_page;
			frappe.ui.make_app_page = function(opts) {
				const page = originalMakeAppPage.call(this, opts);
				
				// 确保setup_hide_right_sidebar_menu被调用
				if (page && typeof page.setup_hide_right_sidebar_menu === 'function') {
					page.setup_hide_right_sidebar_menu();
				}
				
				return page;
			};
		}
	}, 1000);
});